旧游无处不堪寻
无寻处,惟有少年心
C Sharp(一)

之前本来想学习一下 NodeJS,考虑到最近一直在使用 C#(主要使用 .Net Core 的 MVC 和 API),并且之前也仔细地研究过一段时间的 C#,.Net 平台的发展也有上升趋势,最近微软收购 Github,打算整合自己的平台,还有 Visual Studio 这一个宇宙第一 IDE 加持,所以就打算把后台技术栈先放在 .Net 上。
目前的打算是将 C# 的知识都过一遍,再逐渐学习一些常用类库,最后把 ASP.Net Core MVC 和 API 都好好看看。
这次我打算边复习边将 C# 中的概念与其他语言做一下对比,以方便有其他语言基础的同学可以更好地理解在 C# 中的相似概念。

概述


要注意在使用 .Net 进行开发时,我们要知道 Solution 和 Project 的区别:

  • Solution 是针对需求的一个总的解决方案
  • Project 则用来解决具体的某个问题

各类 C# 可编写的程序

  • Console
  • WinForm(old)
  • WPF
  • WebForm(old)
  • WebMVC
  • WCF
  • WF
  • UWP

我们可以使用 C# 写出上述各种类型的应用,有的已经过时了,现在主流使用技术是: WebMVC、WebAPI 以及 WCF。

类型和命名空间

C# 程序的本质是由多个类型声明组成。命名空间则是与某个名称相关联的一组类型声明。(在写 Objective-C 或者 Swift 时,是没有命名空间的概念,所以官方给出的最佳实践是使用前缀的方式来区分不同类型。)

标识符

C# 中标识符规则:

  • 字母和下划线可以出现在任意位置
  • 数字可以放在除了首位的任意位置
  • @字符只可以出现在首位,但不推荐

C# 语言的标识符是大小写敏感的,这一点跟 Objective-C,Swift,JavaScript 都一样。

语句

C# 中的语句必须以分号作为结束标志。
块是由成对的大括号包围的 0 条或多条语句序列,在语法上,相当于一条语句。

  • 在语法上只需要一条语句,而一条语句无法表达时,就需要使用块
  • 某些特定的程序结构只能使用块
  • 虽然简单语句以号结尾,但块后面不跟分号(这样会多解析一条空语句)

字符串插值

新版 C# 可以使用字符串插值,类似 JavaScript 中的字符串插值:

var a = 10;
var b = 20;
var str = $"a + b= {a + b}";

注释

C# 允许三种注释:

  • 单行注释 //
  • 多行注释 /**/
  • 文档注释 ///

类型,存储和变量


如果要描述程序代码特征的话,我们可以说 C 程序就是一组函数和数据类型,C++ 程序就是一组函数和类,而 C# 则是一组类型声明。

namespace MyProgram
{
DeclarationOfTypeA
DeclarationOfTypeB
class C
{
static void Main()
{
}
}
}

类型是一种模板

我们学习 C#,其实就是学习如何创建和使用类型,所以我们需要了解什么是类型。
我们可以把类型想象成创建数据结构的模板,模板本身不是数据结构,但可以描述由改模板构造的对象特征。
类型由下面元素定义:

  • 名称
  • 保存数据成员的结构
  • 一些行为和约束

比如,int 类型:

  • 名称: int
  • 结构: 4 字节
  • 行为: 32 位整数

实例化类型

从模板创建实际对象的过程,就称为实例化该类型。

  • 通过实例化类型创建的对象,可以称为对象,也可以称为实例
  • C# 中,每个数据项都是某种类型的实例

数据成员和函数成员

像 short,long 等这样的类型称为简单类型,只能存储一个数据项。

其他的类型可以存储多个数据项,如数组类型就可以存储多个相同类型的数据项。这些数据项称为数组元素,通过索引来获取每个数组元素。C# 数组这一特征与 Objective-C 相同,与 JavaScript 的特征不同。

然而,另外一些类型可以包含不同类型的数据项,这些类型中的数据项个体称为 成员
有两种成员:

  • 数据成员
  • 函数成员

预定义类型

C# 提供了 16 种预定义类型,包括 13 种简单类型和 3 种非简单类型。
所有预定义类型由全小写字母组成,预定义的简单类型包括以下 3 种:

  • 11 种数值类型:
    1. 不同长度的有符号和无符号整数类型
    2. 浮点数类型: float 和 double
    3. 高精度小数类型: decimal
  • 1 种 Unicode 字符类型: char
  • 1 种布尔类型: bool

与 Objective-C 或 JavaScript 不同,C# 中的数值类型不具有布尔含义。

3 种非简单类型:

  • string: Unicode 字符数组
  • object: 所有其他类型的基类
  • dynamic

注意: 在 C# 程序中,应使用小写的 C# 类型名称而不是大写的 .Net 类型名称。

用户定义类型

有 6 种类型可以由用户自己创建:

  • class 类型
  • struct 类型
  • array 类型
  • enum 类型
  • delegate 类型
  • interface 类型

类型通过类型声明创建,类型声明包含以下信息:

  • 要创建的类型种类
  • 新类型名称
  • 对每个成员的声明(array 和 delegate 除外,他们没有命名成员)

一旦声明了类型,就可以像预定义类型一样使用了。

预定义类型已经由系统创建好了,我们直接使用即可,而用户定义类型,我们使用前需要先进行声明,再使用。

值类型和引用类型

对于非成员数据的存储(如函数中的局部变量):

  • 值类型存储于栈内存
  • 引用类型的 数据部分 存储于堆内存,引用部分 存放在栈内存

对于成员数据,存储有些不同:

  • 引用类型的 数据部分 始终存放在堆内存
  • 值类型的对象,或者引用类型的 引用部分,可能存储在栈内存,也可能存储在堆内存,取决于执行环境

C# 类型分类

  • 预定义类型: 对于简单类型都是值类型,非简单类型都是引用类型
  • 用户定义类型: struct 和 enum 类型是值类型,其他 4 种是引用类型

变量

C# 提供了 4 中变量:

  • 本地变量
  • 字段
  • 参数
  • 数组元素

变量在使用前必须声明。变量声明完成了两件事:

  • 给变量命名,并关联了一种类型
  • 让编译器为它分配了一块内存

我们还可以直接在声明时初始化变量。
一些类型的变量如果在声明时没有初始化,那么会被自动设置为默认值。
注意: 本地变量和参数不会被自动初始化,类字段,结构字段和数组元素会被自动初始化。